約 5,547,407 件
https://w.atwiki.jp/ffxi_drk/pages/170.html
バージョンアップ情報(2007/11/20) 新ジョブの追加や新エリアなどが拡張される「アルタナの神兵」に関わる大きなバージョンアップ。 既存ジョブへのアビリティ追加や両手武器への弱体調整などが確認されている。 個人的には両手武器の攻防関数や固定ダメージなど強過ぎである思うので、この部分での弱体をして欲しいなと思います。命中関係をイジられると、かなり困ります。 バージョンアップ情報(2007/11/20) [#j9b3e445] いままで確認されている内容 [#ccfd5215] バージョンアップ関連リンク [#k8199668] バージョンアップ用の簡易板 [#y4ada75b] 肉料理向け装備パターン:1 [#acca461d] 面白そうな計算をしてみた。 [#qa85a524] STR1 = 攻撃力0.75 DEX1 = 命中力0.75 [#zb626b47] いままで確認されている内容 両手武器の調整、シーフ、獣使い、狩人にアビリティの追加など。 詳細はクリエイターズボイスZにて バージョンアップ関連リンク オフィシャルサイト 追加アイテム一覧 バージョンアップ用の簡易板 #article 肉料理向け装備パターン:1 ちさ (2007-11-25 (日) 06 05 25)エルヴァーンでヘッジホッグパイ込みで命中405・ヘイスト13%・攻撃力548。命中を上げる手段はディアボリクアイ(命中+20)と暗黒(命中+25)。詩人からの支援は基本的にメヌマチ。シフマムはマドリガル前提で頑張りましょう的な感じで。#ref(drk_071120-01.jpg)// エルヴァーンでホーバージョン+1とかにすると408。エルヴァーン以外ならノルマ達成かも。 -- ちさ ギロだと命中が安定しないだろうから安定度が高いクロスリーパー使ってしまうのも手かも? -- ちさ トータル的にはスシ食べてメヌメヌのが安定する気がしてきたのは【ヒミツ】w -- ちさ 名前 コメント 面白そうな計算をしてみた。 ちさ (2007-11-22 (木) 08 11 39)鎌間隔528でA=ヘイスト13%+攻撃力548、B=ヘイスト18%+攻撃力472、命中率はどちらも100%とした時、どちらが強いのかを計算してみた。AとBの間隔の最小公倍数を求めるために最小公約数を算出。mod(459/432)=27mod(432/27)=0最小公約数は27。次に最大公倍数を求める。459/27=17432/27=16最小公倍数 27*17*16=73447344/60=122sec 122/60=2min 間隔7344は約2分相当(A)7344/459=16振り (B)7344/427=17振り平均与ダメはゴブリで算出。D値97、STR120、ディア2。敵はゴーレム。(A)122.5*16=1960(b) 94.5*17=1605WSは命中を考慮してAはクロスリーパー(2hit)、Bはギロティン(4hit)(A)512*16/7=1126(B)484*17/7=11612分単位での削りスピード(A)1960+1126=3086(B)1605+1161=2766(A)3086*30=92580dmg/h(b)2766*30=82980dmg/h鎌間隔528でAをヘイスト13%+攻撃力548、Bをヘイスト18%+攻撃力472、命中率はどちらも100%とした時、Aの方が強い。という結果になった。 名前 コメント STR1 = 攻撃力0.75 DEX1 = 命中力0.75 ちさ (2007-11-20 (火) 07 08 22)攻防関数も強化前に戻った感じかな?wコリブリにギロ1200〜1300、クロス1000ちょい。オワタ(´Д`)// 振り回されすぎて疲れましたね・・・・ちなみにドレインサンバがやばいです -- ace 両手武器が強過ぎる事に反発が多いのは予想外でしたね。ドレインサンバちょっと楽しみですw -- ちさ 名前 コメント
https://w.atwiki.jp/battlefield1942/pages/456.html
GCN Mario Kartとは? 正式名称:GCN Mario Kart 作者:Apache Thunder 公式サイト:http //www.bfmods.com/viewtopic.php?f=33&t=50&sid=2adf809e3cc3b85ceed7e31346aff47f 最新バージョン:1.2f MOD紹介 ゲームキューブ版のマリオカートを忠実に再現したmod。 バージョン1.1よりカートや甲羅、バナナの仕様にも変更が加えられた バージョン1.2fよりデイジークルーザーと摩天楼の追加、キノコブリッジの車両が道に沿って動作、車両が2台追加 コース紹介 レース GC版ルイージサーキット デイジークルーザー ベビーパーク キノコシティ キノコブリッジ モンテタウン カラカラ遺跡 バトル 摩天楼 ブロックシティ ルイージマンション どかんひろば 動画 MOD祭りの様子 http //www.nicovideo.jp/watch/sm10566170 http //www.nicovideo.jp/watch/sm10567727 ダウンロード GCN Mario Kart v1.2f GCN Mario Kart v1.2fダウンロード GCNMarioKart_v11 bf-singleplayerからダウンロード。 GCNMarioKart_v11.rar コメント MOD祭り面白かったー -- 名無しさん (2010-05-01 12 16 03) ファイル壊れてる・・・ -- 名無しさん (2011-11-05 08 41 06) 著作権大丈夫か -- 名無しさん (2013-01-23 16 56 58) 名前 コメント
https://w.atwiki.jp/scslighting/pages/44.html
主に生の色温度を調整するためのゼラのこと。 色を付けるためのものではない。 アンバー(A-1~A-5)のフィルターは色温度を下げる為に、ブルー(B-1~B-6)は上げる為に使用される。 SCSではブルーが目潰しなどでよく使用される。 コンバージョン・フィルターの色見本 (上がA番台、下がB番台)
https://w.atwiki.jp/underrail/pages/40.html
日本語化に必要な物 Underrailのゲーム本体 新バージョン日本語化ファイル(機械翻訳。Castle Orangeさん作) .NET5.0(最終版のSDK 5.0.408。Windows32ビットPCならx86を、64ビットPCならx64をダウンロードすること) .NETFramework4.0 NALs氏制作の日本語テキストファイル(機械翻訳から品質が大幅に改善、DLCの内容もカバー) 日本語化の手順 まずは日本語化ツールに同梱されている「00_はじめに必ずお読みください.txt」「01_ファイル説明.txt」を読むこと。 1.あらかじめ.NET5.0および.NETFramework4.0をPCにインストールしておく 2.(任意。ただし強く推奨) NaLs氏制作の日本語テキストファイルの中身を新バージョン日本語化ファイルの中身に移動、上書きする。 注意点として、4つあるテキストファイルのうち「exe_Strings.txt」だけは [UnderrailJPTR2\ExeRewrite] 内にある点に留意すること。 3.Underrailのゲーム本体ファイルを開き、中にあるdataファイル(Steam版ならばSteam/steamapps/common/Underrail/data)を、 4.日本語化ファイル内にあるSET_ALL.batにドラッグ&ドロップする。 5.日本語化処理が開始される。しばらく待てば完了。 注意点 オリジナル版 (一部NALs氏版と共通) 機械翻訳かつ、動作確認はまだ終わっていません。導入は自己責任でお願いします。 日本語化ファイルの置き場所のアドレスに半角スペースが含まれていると正常に日本語化できなくなります。 ごく一部ながら、会話中に選択肢が表示されず先に進まない箇所があります。その場合は"1"キーを押して会話を進めてください。 Interface SizeがSmall~Classicの場合、Combat Stats(Cキーを押すと表示される戦闘関連ステータス)の各項目にカーソルを合わせた際に表示される説明文が一段ずれてしまいます。あらかじめ理解していれば支障はありませんが、それを避けたい場合は解像度は縦1000以上かつ、Interface Sizeをできるだけ大きなものを選択してください。 日本語化を再度入れなおす際には、本体のdataファイル及びUnderrail.exeファイルは日本語化前の物を使用すること。 滅多にありませんが、エリア移動時にエラーが発生した場合「元の英語版に戻して」「ひとつ前のオートセーブデータから開始」することで回避できます。 NALs氏版 導入は自己責任で。 D12(DLC Expeditionの特定エリア)は進入するとエラーが発生してゲームが終了してしまいます。攻略・進行上の影響はルートが取れないことを除けば少ないエリアですが、念のためにオートセーブ設定は弄らないでおきましょう。一時的に元の英語版もしくはCastleOrange氏の機械翻訳版に戻すことでも対処できます。 表記ブレが多々あります。 元ネタが分り難い所は訳注入れてます。 旧日本語化情報 + ... 日本語化に必要な物 Underrailのゲーム本体(Ver,1.0.4.17 日本語化ファイル(グーグル機械翻訳、Castle Orangeさん作) 日本語化の手順 ゲーム本体は現バージョンではなくLegacy版(Ver1.1.1.6)を使用すること。比較的近いバージョンを用いる必要があるためです。 Steam版であればSteamクライアントで[ゲーム]の左一覧にあるUnderrailを右クリックし[プロバディ]→[ベータ]の中から選択。 Gog版はGog galaxyでUnderrailを右クリックし[インストール管理]→[設定]からインストール欄にあるベータチャンネルで選択します。 以降は基本的には日本語化ファイル内の「使い方.TXT」を参照してください。 そちらに書かれている通り、日本語化前にバックアップは取っておく事。 進行上何か起きた場合、一時的に元に戻す事で解決する場合があります。 本作のセーブデータは「Users\ username \Documents\My Games\Underrail」内にある為、ゲーム本体の消去や変更を行っても続けてプレイ可能です。 現時点(UnderRail_JPTR1.4.2)で判明している、問題が発生するファイル 「data\dialogs\characters\jy_kareem.udlg」…該当キャラクターと会話不能 「data\dialogs\support\dc_tchortistguard.udlg」…特定選択肢の消失 応急処置になりますが、日本語化前の同名ファイルで置き換える事で対処可能です。 現行バージョン(Ver,1.1.1.4)+DLCでの動作について 一部追加テキスト(新規クリーチャーMole Cricketや新勢力アーマーの支給に関するもの)が無かったことになる。つまり旧バージョンのままに巻き戻る。 DLC導入によって既存キャラに追加・変更される会話テキストもおおむね日本語化される DLC追加キャラ・マップでのテキストはほぼ英語のまま。追加Featやアイテムは一部日本語化・一部は英語のまま、一部テキスト消失。 性能に変更のあったアイテム(例 Lifting Beltの所持可能重量+30等)の説明文と効果が反映されず旧バージョン仕様に戻る。 Temporal Manipulationのアビリティの効果説明テキスト消失。 日本語化していると本体アップデートに失敗する。本体をアップデートしてから適用する必要あり。 Riftにてトラベル先にGray Army Baseを選択すると、エラーが発生しタイトル画面に戻ってしまう。未探索等が気になるなら初回で用事を済ませておく事。 DLC攻略にあたってはほぼ英語でのプレイになってしまう事、一部アビリティの説明文が消える事を除けばプレイ自体は可能です。
https://w.atwiki.jp/nacho/pages/161.html
Bantam Caldari Tech1 フリーゲート コメント
https://w.atwiki.jp/sherpa2000/pages/103.html
ArchiCADの上位バージョンのデーターは、下位バージョンでは読み込めません。 代田
https://w.atwiki.jp/starcraft2story/pages/23.html
ここを編集 MISSION OBJECTIVE Exploit resources on Redstone CREDIT REWARD 110,000 RESEARCH OPPORTUNITIES +3 Zerg Research +実績 01_The%20Devil%27s%20Playground.jpgThe Devil s Playground [15] Complete all mission objectives in "The Devil s Playground" mission. ミッション 【The Devil s Playground】 中のクリア目標を全て達成せよ。 02_Red%20Lobster.jpgRed Lobster [10] Kill the Brutalisk with lava in "The Devil s Playground" mission on Normal difficulty. ミッション 【The Devil s Playground】 難易度 "Normal" において、ブルタリスクを溶岩を使って殺せ。 ・上昇する溶岩に誘い込んで殺せ。 03_Reaper%20Man.jpgReaper Man [10] Locate all of Tosh s Crew in "The Devil s Playground" mission on Hard difficulty. ミッション 【The Devil s Playground】 難易度 "Hard" において、トッシュの仲間を全て発見せよ。 ☆ 隠し実績 ☆ 02_The%20Scenic%20Route.jpgThe Scenic Route [0] Destroy all Zerg structures in "The Devil s Playground" mission on Normal difficulty. ミッション 【The Devil s Playground】 難易度 "Normal" において、全てのザーグの建物を破壊せよ。 ミッション・ブリーフィング ▽惑星(Redstone III) Securing the rights to exploit Redstone s mineral fields was the flashpoint for conflicts between different mining guilds prior to the start of the Terran Guild Wars. レッドストーンのミネラル層を開拓する権利の確保が、テランギルド戦争に先立つ鉱山ギルド間の闘争の引きがねでした。 ▽打ち合わせ Tosh I hear the mighty Jim Raynor s on the move, but short on funds. 偉大なジム・レイナーが動き始めたのは聞いてる、そして資金不足もな。 Tosh The planet Redstone s got the most valuable minerals around - an with the zerg invasion, the Kel-Morians packed up and left it all behind. 惑星レッドストーンからはとても高価な資源が取れる - ザーグの襲撃もあるけどな。そんでケル-モリアンの奴らは荷物畳んで全部トンズラした。 Tosh Some enterprisin men could turn a big profit there. Meet me at Redstone if you want a piece of the action. 野心のある奴ならでっかい利益があげられる所だ、あそこは。アンタがレッドストーンの一角で活動してぇなら俺に面通ししな。 ミッション開始シーン REDSTONE SYSTEM 13 23 - Shipboard Time レッドストーン システム 13 23 - 船内時間 Raynor Redstone. Heck of a place. レッドストーンか。ふざけたとこだ。 Raynor I ever mention how much I hate volcanic planets? 俺がどんなに火山星が嫌いか何時も言ってるだろ? Tosh (distorted) Good to see you made it. They call me Tosh. You help me mine the minerals I need 会えてうれしいぜ。トッシュと呼んでくれや。俺の欲しい資源を採掘するのを手伝ってもらうぜ。 Tosh and I ll make it worth your while. もちろん損はさせねぇ。 Raynor What s the catch? 何か裏があるんじゃないだろうな? Tosh Well, this place is a little...unstable. The low ground gets flooded with lava every few minutes. ああ、この土地は少しばかり...不安定だ。低地は2,3分毎に溶岩に沈んじまう。 Tosh Of course that s where the richest mineral nodes are found. But that ll be no problem for a big tough guy like you. もちろん、そこには価値ある資源の塊が見つかんだ。だがアンタのようなすげぇタフガイにゃ問題ねぇだろ。 Horner Sir, I m also picking up zerg bio-signatures on the surface. サー、地表にザーグの生体反応を確認してます。 Horner We ll need to spend some of what we mine just to defend the operation. The more we spend, the longer this is gonna take. こちらは採掘の作業の為の護衛に幾らか資源を必要とするでしょう。多く浪費すれば、それだけ長引いてしまいます。 Raynor Huh, lava and zerg - two of my favorite things. チェッ、溶岩とザーグか - 二つとも俺のお気に入りだよ。 Raynor (resigned) Let s do this. やるぞ。 ミッション中 [Tutorial] Rich Minerals - Rich Mineral Fields give 7 Minerals returned per SCV insted of the usual 5 Minerals. Rich Mineral Field are yellow. 高純度ミネラル源では、SCVが1度採掘するごとに通常の5ミネラルではなく、7ミネラル得ることができます。高純度ミネラル源の色は黄色です。 <溶岩:上昇> Adjutant Alert. Lava surge imminent. Evacuate low ground immediately. 警告。溶岩が上昇してきます。早急に低地から退避してください。 Raynor Lava s rising, get those SCVs to high ground right now! 溶岩が上昇中、SCVをすぐに高所へ移動させてください! <溶岩:下降> Adjutant All clear. It is now safe to proceed with mining operations. オールクリアー、安全に採掘作業を続行できます。 Horner This counter shows the estimated time until the next lava surge. Move all units and structures to high ground when a surge is imminent. こちらの計測器に次の溶岩の氾濫までの推定時間を表示します。全てのユニット及び建造物は上昇間際には高所へ移動してください。 <リーパー登場> Tosh I got some friends comin to help you out - Reapers. 俺のダチにアンタを助けるように来て貰った - リーパーだ。 Swann Reapers you say? Hell, cowboy, we gotta train more of these guys, they re seriously bad ass! リーパーと言うのか!おい、カウボーイ、俺らもこいつらをもっと訓練できるようにするぞ、こいつらはマジで性質悪いぞ! [Tutorial] New Unit Reaper - Light harassment infranty -- Reapers are fast-moving raiders that can jump up and down cliffs. Reapers are armed with pistols and equipped with D-8 Charges, explosive devices that do extra damage against structures. Can attack ground units only. リーパー-嫌がらせ軽歩兵 -- リーパーは高速で移動し、段差もジャンプして超えることができます。リーパーはピストルと建物破壊用爆弾を装備しています。Reaperは地上ユニットにのみ攻撃可能です。 <ボーナス目標発生> Tosh Some of my boys disappeared in this area. Wanna see if they re still alive. このエリアで何人か居なくなっちまった。生きてたら見つけてやってくれや。 <ブルタリスク確認> Stetmann Ah, sir! Sir! Ah scanners show a large bio-signature close to your position - a Brutalisk I think! If you could kill it that d get my...err our research off to a flying start! おわ、サー!サー!あー、スキャナーが巨大な生体反応をそっちの近くで見つけたんだよね - ブルタリスクだと思うんだよ!もし殺せたら僕の...うう、僕らの研究が一気に進むんだよ! [Tutorial] Brutalisk - A Zerg Brutalisk is a rare and dangerous creature. Use extreme caution when approaching one. ZergのBrutaliskは珍しく、かつ危険な怪物です。近づく際は細心の注意を払ってください。 <溶岩:上昇1分前> Adjutant Seismic activity is increasing. Caution is advised.(同じ繰り返し、以降省略) 地震活動が増えています。警戒を提案します。 <溶岩:上昇> Adjutant Alert. Lava surge imminent. Evacuate low ground immediately.(同じ繰り返し、以降省略) 警告。溶岩が上昇してきます。早急に低地から退避してください。 <溶岩:下降> Adjutant All clear. It is now safe to proceed with mining operations.(同じ繰り返し、以降省略) オールクリアー、採掘作業を続行するのに安全になりました。 Horner Just a reminder sir; the more minerals we expend on forces, the longer it s going to take to reach our goal. Try to be economical. 念のためですが、サー;軍隊に多くの資源を浪費すれば、こちらのゴールが遠くなることをお忘れなく。節約を心がけてください。 <トッシュボーナス目的地到達> SCV Tosh sent ya to help? About time! Let s finish up this contract and get the hell off this planet. トッシュが助けを寄越してくれたのか?ようやくきたぜ!契約を終わらせてこの星からおさらばしようぜ! [Tutorial] New Ability Lift Off - A Command Center can load nearby SCVs that are in danger and then unload them when the danger has passed. The Command Center can also Lift Off, allowing itself to relocate to richer Mineral Fields. Use both of these functions to avoid the Lava Surges. Command Centerは近くの危険な状態にあるSCVを格納でき、危険が過ぎ去った後に排出することができます。また、Lift Offを使用することで、自らをより豊富なミネラル源がある場所へ移動することができます。 Tosh Since you re doin right by me - I ll do right by you. Here s the coordinates of the nearest mineral nodes. お前には借りができたな - 俺があんたを助ける番だ。ここの近くの座標に資源の鉱床があるぜ。 <ミネラル4000/8000達成> Tosh Your men work fast. We ve already got half the minerals we need. お前んとこの奴は仕事が速いな。俺らの欲しい資源の半分はすでにあるぜ。 Tosh I scanned for mineral outcrops before we landed. Sending more data to you now. 俺らが降りる前に資源の露出部分をスキャンした。今から追加データを送るぜ。 <溶岩上昇によりSCVを失うと、輸送機でSCV追加> Raynor Damn, losing all those SCVs is gonna set us back. I m gonna call in some reinforcements. クソ、あれら全部のSCV分、遅れが出るぞ。増援を呼ばにゃならん。 Tosh Doin well there, Mr. Raynor. We got traces of more minerals over on the other side of the canyon. 調子よくて何よりだな、レイナーさんよ。渓谷の反対側の向こうにもっと多くの資源の痕跡を見つけたぜ <ミネラル6500/8000達成> Tosh Almost done, Mr. Raynor. Just a few more minerals to go. 大体終わったな、レイナーさんよ。あとちょっとの資源で終わりだ。 Tosh Doin well there, Mr. Raynor. We got traces of more minerals over on the other side of the canyon. 調子よくて何よりだな、レイナーさんよ。渓谷の反対側の向こうにもっと多くの資源の痕跡を見つけたぜ <ミネラル8000/8000達成> Raynor Alright boys, nice work. We got what we came for. Now lets get outta this hellhole! よし、お前ら、よくやった。目当てのものは手に入れた。さっさとおさらばするぞ! Tosh Finished already? You really are as good as they say Mr. Raynor. I m thinking you and I got a lot more business we can be talking about. 全部終わったのか?アンタは噂通り、できる奴だなレイナーさんよ。もっとビジネスの事で話をしてえところだ。 ミッション達成後 HYPERION BRIDGE 19 32 - Shipboard Time Horner Nice work, sir. The payoff from Redstone really got us back on our feet. 見事でした、サー。レッドストーンでの利益のおかげで、態勢を立て直せますよ。 Raynor Why is that Tosh guy aboard? どうしてトッシュがいるんだ? Horner He wanted to talk to you in person, sir. Something about conducting more business ventures together. 個人的に話をしたいそうで、サー。"ベンチャー事業"の計画でもっと話があるとのことです。 Raynor You do any diggin on him? 奴のことは何か調べたか? Horner Of course, and he s no pirate. Rumor has it he s a renegade Ghost - and until he vanished he was one of the Dominion s top assassins. もちろんです。お尋ね者ではないですね。噂では寝返ったゴーストではないかと - 消える前はドミニオン有数の暗殺者だったという話です。 Horner Now Mengsk hates him almost as much as he hates you. メンスクは彼をあなたと同様に嫌ってるでしょうね。 Raynor Well, I like this guy already. Just the same, we d best keep an eye on him. ふむ、それだけでもう気に入っちまったぜ。それでも、注意を怠らない方がいいな。 Horner Yes sir. はい、サー。 HYPERION CANTINA 25 Minites Later 25分後 ▼Armory ∵Swann Swann Now we got pirates on the ship. Kachinsky -- better take an inventory. 今度は海賊が乗船か。カチンスキー、物品リストをさらい直した方がいいな ▼Bridge ▽Tosh Tosh Ah here s the man! We make a good team, me and you. いたな!俺たちゃぁいいチームになるぜ、あんたと俺でな Raynor Why are you here, Tosh? Our business is done unless ya got something else for me? どうしてまだここにいる、トッシュ?新しい話があるんじゃなけりゃ、もう仕事は済ませたぜ。 Tosh Yeah I got another job for us on a world called Bel Shir. Interested? おうよ。ベルシールって星で仕事の話がある。興味あっか? Raynor Maybe. But what s in it for me? Piracy ain t exactly my chosen path. もしかしたらな。で俺の取り分は何だ?海賊仕事は好きとは限らねぇんでね Tosh Everyone knows Jim Raynor wants to put the hurt on Mengsk. I can help you with that...I can help you big time. ジムレイナーがメンスクを痛い目に合わせてやりたがってんのはみんな知ってることで。俺ならあんたを助けてやれるぜ...時間も節約できる Raynor I ll think about it. For the time being - welcome aboard the Hyperion. We ll talk later. 考えとくよ。まあともかく、ハイペリオン号にようこそ。また後で話そう。 ∵Horner Horner You might want to talk to our new guest. Maybe ask him to leave my bridge? 新しい客人とお話になっては。私のブリッジから離れるよう尋ねるなどいかがですか? ▼Cantina ▽Tychus Raynor You ever heard of a guy named Gabriel Tosh? ガブリエル・トッシュって名前は聞いたことあるか? Tychus Only rumors. Way I hear it, he was mixed up in some covert branch of the Ghost program that produced some real scary bad-asses. Word was Tosh snapped and went rogue. I d play it real cool with that kind. He d cut your throat soon as look atcha. 噂だけはな。俺が聞いた話じゃ、ゴースト計画の中でも極秘の部隊にいたらしい。本気でおっかねぇ奴らを育成したっていう。で、トッシュの奴はぶっ飛んでごろつきになったらしいぜ。あの手の奴には弱味を見せねえことだ。見た途端首を切り裂かれちまうからな。 Raynor I ve dealt with rogue Ghosts before. It s the ones still working for Mengsk I got a problem with. 野良ゴーストなら前にも仕事をしたことがある。まだメンスクのために仕事してる奴らの方だな、気に食わねぇのは。 ▽News【UNN STUDIOS】 Vermillion Donny Vermillion, UNN. Your first, last and only stop for the truth. Tonight our own Kate Lockwell uncovers a secret shadow war, waged by our brave Dominion ghosts, against a ruthless, hidden enemy. UNNのドニー・ヴァーミリオンです。最初で最後、そして唯一の真実のニュース番組へようこそ。今夜は我らがケイト・ロックウェルが今まで公になっていなかった影の戦いを暴きます。私達ドミニオンの勇気あるゴースト達が、容赦ない隠れた敵と戦っているとのことです。 Lockwell Thanks Donny. I m talking live with Censored , a specialist in the Dominion Censored . Censored , I understand that you and your comrades have been Censored against a Censored Censored of Censored . What can you tell us about that? ありがとうドニー。今私が生中継でお話をうかがっているのは、 ピー 、ドミニオンの ピー スペシャリストです。 ピー 、あなたとあなたの仲間は、 ピー の ピー に対して ピー てきたとお聞きしています。そのことについてお話を伺えますか? Silhouetted Figure Well Kate, I m not allowed to say much, but I can tell you Censored and his allies will not Censored . We expect to Censored them very soon. そうですね、ケイト、話せることは少ないんですが、少なくとも ピー と彼の味方は ピー ないことだけは言えます。もうすぐ彼らを ピー る予定です。 Vermillion I think we ll all sleep a little better tonight, knowing our Dominion forces are watching over us. For UNN, I m Donny Vermillion. ドミニオン軍がしっかり守ってくれていると分かれば、今夜はよく眠れそうですね。UNNより、ドニー・ヴァーミリオンでした。 ∵ ▼Laboratory ▽Hanson Hanson Just out of curiosity, I did some tests on the minerals from Redstone. I thought you should know - I found trace quantities of jorium, a rare crystal with very unique properties. ちょっと興味があったから、レッドストーンのミネラルを検査してみたの。知っておいた方がいいと思って - 微量だけどジョリウムの痕跡を見つけたわ。希少な鉱物で、とても珍しい性質を持ってる Raynor I m all ears, Doc. What kind of properties? 続けてくれ、ドク。どういう性質があるんだ? Hanson Jorium resonates at the same frequency as certain brain waves. It s been theorized that it could be used to stimulate brain activity or even produce psionic abilities in human subjects. 人間のある種の脳波と同じ周波数で振動するのよ。理論上は、脳の活動を促進したり、人間にサイオニック能力をもたらしたりできるとされてるわ。 Raynor What the hell does Tosh want that for? 何だってトッシュはこれを欲しがってるんだ? ここを編集
https://w.atwiki.jp/kakis/pages/2087.html
sentant /// / どうもありがとうございます。 \ [ vetyolom ] \ 敬意はsentより上、misentantより下 sent sentant = misent misentant
https://w.atwiki.jp/elementary-os/
elementary OS Linux ディストリビューション「elementary OS」の日本語wikiです(公式ではありません) まだまだ情報が少ないですが、みんなで協力して集めていきましょう。 elementary OS 1(おーぷん2ちゃんねる) http //engawa.open2ch.net/test/read.cgi/linux/1432467470/ elementary OSの公式サイト http //elementary.io/ (Custom→$0でダウンロードor寄付) 導入の参考記事 http //netbuffalo.doorblog.jp/archives/5007385.html http //frozenstream.blog6.fc2.com/blog-entry-3184.html 動画 https //www.youtube.com/watch?v=WYrobaenFCc https //www.youtube.com/watch?v=MC0kuGECRYk このページは自由に編集することができます。 メールで送られてきたパスワードを用いてログインすることで、各種変更(サイト名、トップページ、メンバー管理、サイドページ、デザイン、ページ管理、等)することができます まずはこちらをご覧ください。 @wikiの基本操作 編集モード・構文一覧表 @wikiの設定・管理 分からないことは? @wiki ご利用ガイド よくある質問 @wiki更新情報 @wikiへのお問合せフォーム 等をご活用ください アットウィキモードでの編集方法 文字入力 画像入力 表組み ワープロモードでの編集方法 文字入力 画像入力 表組み その他にもいろいろな機能満載!! @wikiプラグイン一覧 @wikiかんたんプラグイン入力サポート バグ・不具合を見つけたら? 要望がある場合は? お手数ですが、お問合せフォームからご連絡ください。
https://w.atwiki.jp/dslbookwip/pages/12.html
このページはhttp //martinfowler.com/dslwip/Intro.htmlからの引用です | DSL-WIP Home | WORK-IN-PROGRESS - this material is still under development An Introductory Example Last significant update 06 Aug 07 Contents Miss Grant s Controller The State Machine Model Programming the Controller with a Domain Specific Language Languages and Model Using Code-Generation Using Language Workbenches Visualization Picking up this book, you may be asking yourself such questions as what is a DSL , how does it fit in with my usual development work and why would I find such a thing useful ? This chapter begins by looking at these questions. I ll talk about what a DSL is, the various types of DSL, the reasons to use a DSL, and the broader topic of language processing. At this stage I won t talk about how the various styles of DSL work - we ll get into that later. Miss Grant s Controller As is usual for me, I ll base this discussion on an example, as I find that a concrete example usually makes it easier to follow an abstract topic like this. Let s imagine a company that makes systems to control access to secret compartments. Their customers are people who are bored with numeric keypads and security codes, instead preferring something recalling bad movies set in gothic castles. So Miss Grant has a secret compartment in her bedroom that is normally locked and concealed. To open it she has to close the door, open the second draw in her chest, turn her bedside light on - and then the secret panel is unlocked for her to open. Mr G has the same basic system for a panel in his bedroom. He has to open his bathroom door and turn on the main light which allows him to open the panel. The panel reveals a safe, but it has an overriding lock that cannot be opened unless he turns his light off and on again. Mr C has a compartment in his office, he has to close his main door, take a picture off the wall, turn his desklight on three times, open the top draw of his filing cabinet, turn the desklight off - and then the panel s unlocked. If he forgets to turn the desklight off, he wants an alarm to sound. Although this example is deliberately whimsical, the underlying point isn t that unusual. What we have is a family of systems which share most components and behaviors, but have some important differences. In this case we have some kind of controller software which communicates with various devices around the room. The variability is in the sequence of actions that can be carried out and the actions that the software does as a result of these sequences. We want to arrange things so that the company can install a new system with the minimum of effort, so it must be easy for them to program the sequence of actions into the controller. Looking at their many customers they realize there is a common theme to the way they behave. The various devices send events as they are manipulated. The system reacts differently to events depending on the recent sequence of events. This style of thinking about behavior is that of a state machine. Thus it makes sense to build a model of a state machine that can be programmed for individual customers at each site. That way the general behavior can be resued for each customer and setting up a new customer just means writing the specific things for each case. The software is written in java, running on a job lot of toasters they picked up from a failed dot com. The State Machine Model There are many varieties of state machine models around, this one is simple, and with a little twist for the this particular case. There are frameworks out there to run state machines, but we can do with something much simpler that s more suited to this particular domain. By doing this we give up some power for an easier job working with it. This issue isn t really part of the DSL discussion so I won t explore it further. To help understand how the state machine model works, let s take Miss Grant s system. Figure 1 State diagram for Miss Grant The system has a controller that receives events and commands from the various devices scattered around. Each event and command has a four letter code that s the actual signal sent through the communication channels. I want to refer to these in the controller code with symbolic names, so I create event and command classes with a code and a name. I keep them as separate classes (with a superclass) as they play different roles in the controller code. class AbstractEvent... private String name, code; public AbstractEvent(String name, String code) { this.name = name; this.code = code; } public String getCode() { return code;} public String getName() { return name;} public class Command extends AbstractEvent public class Event extends AbstractEvent Figure 2 Class diagram of the state machine framework [TBD Add reset event association to class diagram] The key to the structure is that state class. Each state class keeps track of the events and commands. class State... private String name; private List Command actions = new ArrayList Command (); private Map String, Transition transitions = new HashMap String, Transition (); public void addTransition(Event event, State targetState) { transitions.put(event.getCode(), new Transition(this, event, targetState)); } class Transition... private final State source, target; private final Event trigger; public Transition(State source, Event trigger, State target) { this.source = source; this.target = target; this.trigger = trigger; } public State getSource() {return source;} public State getTarget() {return target;} public Event getTrigger() {return trigger;} public String getEventCode() {return trigger.getCode();} The state machine holds on to its start state. class StateMachine... private State start; public StateMachine(State start) { this.start = start; } Any other states in the machine are then those that are reachable from this state. class StateMachine... public Collection State getStates() { List State result = new ArrayList State (); gatherForwards(result, start); return result; } private void gatherForwards(Collection State result, State start) { if (start == null) return; if (result.contains(start)) return; else { result.add(start); for (State next start.getAllTargets()) { gatherForwards(result, next); } return; } } class State... Collection State getAllTargets() { List State result = new ArrayList State (); for (Transition t transitions.values()) result.add(t.getTarget()); return result; } There is one particular wrinkle to this problem. These controllers have a particular nature to them in that most of the time they are in their start state, which is effectively an idle state. There are events that advance the state machine, and there are events that take you back to that start state. For this case opening the door always takes you back to the start. So I let the machine keep track of reset events. class StateMachine... private List Event resetEvents = new ArrayList Event (); public void addResetEvents(Event... events) { for (Event e events) resetEvents.add(e); } I don t need to have a separate structure for reset events here. I could handle this by simply declaring extra transitions on the state machine like this class StateMachine... private void addResetEvent_byAddingTransitions(Event e) { for (State s getStates()) if (!s.hasTransition(e.getCode())) s.addTransition(e, start); } I prefer explicit reset events on the machine becuase that better expresses the intention of what I m trying to do. While it does complicate the machine a bit, it keeps the clarity of my intention of how a general machine is supposed to work, as well as keeping the intention of how a particular machine is defined. With the structure out of the way, now lets move on to the behavior. As it turns out, it s really quite simple. The controller has a handle method that takes the event code it receives from the device. class Controller... private State currentState; private StateMachine machine; public CommandChannel getCommandChannel() { return commandsChannel; } protected CommandChannel commandsChannel; public void handle(String eventCode) { if (currentState.hasTransition(eventCode)) transitionTo(currentState.targetState(eventCode)); else if (machine.isResetEvent(eventCode)) transitionTo(machine.getStart()); // ignore unknown events } private void transitionTo(State target) { currentState = target; currentState.executeActions(commandsChannel); } class State... public boolean hasTransition(String eventCode) { return transitions.containsKey(eventCode); } public State targetState(String eventCode) { return transitions.get(eventCode).getTarget(); } public void executeActions(CommandChannel commandsChannel) { for (Command c actions) commandsChannel.send(c.getCode()); } class StateMachine... public boolean isResetEvent(String eventCode) { return resetEventCodes().contains(eventCode); } private List String resetEventCodes() { List String result = new ArrayList String (); for (Event e resetEvents) result.add(e.getCode()); return result; } It ignores any events that are not registered on the state. For any events that are recognized, it transitions to the target state and executes any commands defined on that target state. Programming the Controller with a Domain Specific Language Now I ve implemented the state machine model, I can now program Miss Grant s controller like this. Event doorClosed = new Event( doorClosed , D1CL ); Event drawOpened = new Event( drawOpened , D2OP ); Event lightOn = new Event( lightOn , L1ON ); Event doorOpened = new Event( doorOpened , D1OP ); Event panelClosed = new Event( panelClosed , PNCL ); Command unlockPanelCmd = new Command( unlockPanel , PNUL ); Command lockPanelCmd = new Command( lockPanel , PNLK ); Command lockDoorCmd = new Command( lockDoor , D1LK ); Command unlockDoorCmd = new Command( unlockDoor , D1UL ); State idle = new State( idle ); State activeState = new State( active ); State waitingForLightState = new State( waitingForLight ); State waitingForDrawState = new State( waitingForDraw ); State unlockedPanelState = new State( unlockedPanel ); StateMachine machine = new StateMachine(idle); idle.addTransition(doorClosed, activeState); idle.addAction(unlockDoorCmd); idle.addAction(lockPanelCmd); activeState.addTransition(drawOpened, waitingForLightState); activeState.addTransition(lightOn, waitingForDrawState); waitingForLightState.addTransition(lightOn, unlockedPanelState); waitingForDrawState.addTransition(drawOpened, unlockedPanelState); unlockedPanelState.addAction(unlockPanelCmd); unlockedPanelState.addAction(lockDoorCmd); unlockedPanelState.addTransition(panelClosed, idle); machine.addResetEvents(doorOpened); I look at this last bit of code as quite different in nature to the previous peices. The earlier code described how to build the state machine model, this last bit of code is about how to configure that model for one particular controller. You often see divisions like this. On the one hand is library, framework, or component implementation code; on the other is configuration or component assembly code. Essentially it is the separation of common code from variable code. We structure the common code in a set of components that we then configure for different purposes. Here is another way of representing that configuration code. stateMachine start = idle event name= doorClosed code= D1CL / event name= drawOpened code= D2OP / event name= lightOn code= L1ON / event name= doorOpened code= D1OP / event name= panelClosed code= PNCL / command name= unlockPanel code= PNUL / command name= lockPanel code= PNLK / command name= lockDoor code= D1LK / command name= unlockDoor code= D1UL / state name= idle transition event= doorClosed target= active / action command= unlockDoor / action command= lockPanel / /state state name= active transition event= drawOpened target= waitingForLight / transition event= lightOn target= waitingForDraw / /state state name= waitingForLight transition event= lightOn target= unlockedPanel / /state state name= waitingForDraw transition event= drawOpened target= unlockedPanel / /state state name= unlockedPanel action command= unlockPanel / action command= lockDoor / transition event= panelClosed target= idle / /state resetEvent name = doorOpened / /stateMachine This style of representation should look familiar to most readers, I ve expressed it as an XML file. There are several advantages to doing it this way. One obvious reason is that now we don t have to compile a separate java program for each controller we put into the field - instead we can just compile the state machine components plus an appropritate parser into a common jar, and ship the xml file to be read when the machine starts up. Any changes to the behavior of the controller can be done without having to distribute a new jar. (We do, of course, pay for this in that any mistakes in the syntax of the configuration can only be detected at run time.) A second advantage is in the expressiveness of the file itself. We no longer need to worry about the details of making the various connections through variables. Instead we have a more declarative approach that in many ways reads much more clearly. We re also limited in that we can only express configuration in this file - limitations like this often are helpful because they can reduce the chances for people making mistakes in the component assembly code. These advantages are why so many frameworks in Java and C# are configured with XML configuration files. These days it sometimes feels that you re doing more programming with XML than you are with main programming language. Here s another version of the configuration code. events doorClosed D1CL drawOpened D2OP lightOn L1ON doorOpened D1OP panelClosed PNCL end resetEvents doorOpened end commands unlockPanel PNUL lockPanel PNLK lockDoor D1LK unlockDoor D1UL end state idle actions {unlockDoor lockPanel} doorClosed = active end state active drawOpened = waitingForLight lightOn = waitingForDraw end state waitingForLight lightOn = unlockedPanel end state waitingForDraw drawOpened = unlockedPanel end state unlockedPanel actions {unlockPanel lockDoor} panelClosed = idle end This is code, although not in a syntax that s familiar to you. In fact it s a custom syntax that I made up for this example. I think it s a syntax that s easier to write, and above all easier to read, than the XML syntax. It s terser and avoids a lot of the quoting and noise characters that the XML suffers from. You probably wouldn t have done it exactly the same way, but the point is that you can construct whatever syntax you and your team prefers. You can still load it in at runtime (like the XML) but you don t have to (as you don t with the XML) if you want it at compile time. This language is a Domain Specific Language, and shares many of the characteristics of DSLs. Firstly it s suitable only for a very narrow purpose - it can t do anything other than configure this particular kind of state machine. As a result the DSL is very simple - there s no facility for control structures or anything else. It s not even Turing complete. You couldn t write a whole application in this language - all you can do is describe one small aspect of an application. As a result the DSL has to be combined with other languages to get anything done. But the simplicity of the DSL means it s easy to edit and process. Now look again at the XML representation. Is this a DSL? I would argue that it is. It s wrapped in an XML carrier syntax - but it s still a DSL. This example thus raises a design issue - is it better to have custom syntax for a DSL or an XML syntax? The XML syntax can be easier to parse since people are so familiar with parsing XML. (As it happened for this example it took me the about the same amount of time to write the parser for the custom syntax as it did for the XML.) I d contend that the custom syntax is much easier to read, at least in this case. But however you view this choice the core trade-offs around DSLs are the same. Indeed you can argue that most XML configuration files are essentially DSLs. Let s go back a step further, back to the configuration code in Java I showed you earlier - is that a DSL? While you re thinking about that question look at this code. Does this look like a DSL for this problem? event doorClosed, D1CL event drawOpened, D2OP event lightOn, L1ON event doorOpened, D1OP event panelClosed, PNCL command unlockPanel, PNUL command lockPanel, PNLK command lockDoor, D1LK command unlockDoor, D1UL resetEvents doorOpened state idle do actions unlockDoor, lockPanel transitions doorClosed = active end state active do transitions drawOpened = waitingForLight, lightOn = waitingForDraw end state waitingForLight do transitions lightOn = unlockedPanel end state waitingForDraw do transitions drawOpened = unlockedPanel end state unlockedPanel do actions unlockPanel, lockDoor transitions panelClosed = idle end It s a bit noisier than the custom language earlier, but still pretty clear. Readers who have similar language likings to me will probably know that it s Ruby. Ruby gives me a lot of syntactic options that makes for more readable code, so I can make it look very similar to the custom language. Ruby developers would consider this code to be a DSL. I use a subset of the capabilities of Ruby and capture same ideas as our XML and custom syntax. Essentially I m embedding the DSL into ruby, using a subset of ruby as my syntax. To an extent this is more a matter of attitude than of anything else. I m choosing to look at the Ruby code through DSL glasses. But it s a point of view with a long tradition - Lisp programmers often think of creating DSLs inside Lisp. This brings me to pointing out that there are two kinds of textual DSLs which I call external and internal DSLs. AnExternal DSLis a domain specific language represented in a separate language to the main programming language it s working with. This language may be a custom syntax, or it may follow the syntax of another representation (like XML). AnInternal DSLis DSL expressed within the syntax of a general purpose language. It s a stylized use of that language for a domain specific purpose. You may also hear the termembedded DSLas a synonym for internal DSL. Although it is fairly widely used, I avoid this term because you also hear embedded language applied to scripting languages embedded within applications such as VBA in Excel or Scheme in the Gimp. So I use internal DSL to avoid confusion. Now think again about the original java configuration code - is this a DSL? I would argue that it isn t. That code feels like stitching together with an API, while the ruby code above has more the feel of a declarative language. Does this mean you can t do an internal DSL in Java? How about this? public class BasicStateMachine extends StateMachineBuilder { Events doorClosed, drawOpened, lightOn, panelClosed; Commands unlockPanel, lockPanel, lockDoor, unlockDoor; States idle, active, waitingForLight, waitingForDraw, unlockedPanel; ResetEvents doorOpened; protected void defineStateMachine() { doorClosed. code( D1CL ); drawOpened. code( D2OP ); lightOn. code( L1ON ); panelClosed.code( PNCL ); doorOpened. code( D1OP ); unlockPanel.code( PNUL ); lockPanel. code( PNLK ); lockDoor. code( D1LK ); unlockDoor. code( D1UL ); idle .actions(unlockDoor, lockPanel) .transition(doorClosed).to(active) ; active .transition(drawOpened).to(waitingForLight) .transition(lightOn). to(waitingForDraw) ; waitingForLight .transition(lightOn).to(unlockedPanel) ; waitingForDraw .transition(drawOpened).to(unlockedPanel) ; unlockedPanel .actions(unlockPanel, lockDoor) .transition(panelClosed).to(idle) ; } } It s formatted oddly, and uses some unusual programming conventions, but it is valid Java. It s java written in what is these days called a Fluent Interface style. AFluent Interfaceis an API that s designed to read like an internal DSL. This I would call a DSL - although it s more messy than the ruby DSL it still has that declarative flow that a DSL needs. What makes a fluent interface different to a normal API? This is a tough question that I ll spend more time onlater), but it comes down to a rather fuzzy notion of a language-like flow. Given this distinction it s useful to have a name for a non-fluent API - I ll use the termcommand-query API. Languages and Model There s an important inter-relationship here between the various DSLs and the underlying state-machine model. To implement each of these languages I wrote code that translated from expressions in the DSL into calls on the command-query interface of the model. So while I was parsing the custom syntax version and came across commands unlockPanel PNUL I would create a new command object (new Command( unlockPanel , PNUL )) and keep it to one side (in aSymbol Table) so that when I sawactions {unlockPanelI could add it to the appropriate state (usingaddAction). As a result each DSL I ve shown you created the same configuration of objects in the model. The model, as I discussed earlier, is the engine that provides the behavior of the state-machine. So once we have a populated model, we have a running program whose behavior is encoded in the inter-relationships between the objects in that model. This style is often called an Active Object Model, because in order to understand the behavior of the state machine you can t just look at the code, you also have to look at the way object instances are wired together. Of course this is always true to some extent, any program gives different results with different data, but there is a sense of a greater difference here as the presence of the state objects alters the behavior of the system to a significantly greater degree. When people discuss a programming language you often hear them talk about syntax and semantics. The syntax captures the legal expressions of the program, what in the custom syntax DSL is captured by the grammar. The semantics of a program is what it means, that is what it does when it executes. In this case it is the model that defines those semantics - which is why I will refer to it as aSemantic Model. In this example theSemantic Modelis an object model. ASemantic Modelcan also take other forms. It can be a pure data structure with all behavior in separate functions. I would still refer to it as an active model, because the data structure defines the program s behavior. Looking at it from this point of view, the DSL merely acts as a mechanism for expressing how the model is configured. I often refer to a DSL as a thin facade over a framework. Much of the benefits of using this approach comes from the model rather than the DSLs. The fact that I can easily configure a new state machine for a customer is a property of the model, not the DSL. The fact that I can make a change to a controller at run-time, without compiling, is a feature of the model, not the DSL. The fact I m reusing code across multiple installations of controllers is a property of the model, not the DSL. A model provides many benefits without any DSLs present. As a result we use them all the time. We use libraries and frameworks to wisely avoid work. In our own software we construct our own models, building up abstractions that allow us to program faster. Good models, whether published as libraries and frameworks or just serving our own code, can work just fine without any DSL in sight. But DSLs can enhance the the capabilities of a model. The right DSL makes it easier to understand what a particular state machine does. Some DSLs allow you to configure the model at run time. DSLs are thus a useful adjunct to some models. In discussing this example I described a circumstance where the model was built first, and then I layered a DSL over the model to help manipulate it. I described it that way becuase I think that s an easy way to understand how DSLs fit into software development. Although the model-first case is a common one, it isn t the only one. In a different scenario you talk with the domain experts and posit that a state machine approach is something they understand. You then work with the domain experts to create a DSL that they can understand. In this case you build the DSL and model simultaneously. Using Code-Generation In my discussion so far, I process the DSL by populating theSemantic Modeland then execute theSemantic Modelto provide the behavior that I want from the controller. This approach is what s known in language circles as interpretation. When weinterpretsome text, we parse it and immediately produce the result that we want from the program. (Interpret is a tricky word in software circles, since it carries all sorts of connotations for people, however I ll use it strictly to mean this form of immediate execution.) In the language world, the alternative to interpretation is compilation. Withcompilation, we parse some program text and produce an intermediate output, which is then separately processed to provide the behavior we desire. In the context of DSLs the compilation approach is usually referred to ascode-generation. In this case this might mean generating some java code to represent the particular behavior of Miss Grant s controller. Code generation is often awkward in that it often pushes you to an extra compilation. To build your program you have to first compile the state framework and the parser, then run the parser to generate the source code for Miss Grant s controller, then compile that generated code. This makes your build process much more complicated. However an advantage of code generation is that there s no reason why you have to generate code in same programming language that you use for the parser. In this case you can avoid the second compilation step by generating code for a dynamic language such as javascript or jruby. Code generation is also useful when you want to use DSLs with a language platform that doesn t have the tools for DSL support. I ve come across recent projects that generate code for MathCAD, SQL, and COBOL. Many writings on DSLs focus on code-generation, even to the point of making code-generation the primary aim of the exercise. As a result you can find articles and books extolling the virtues of code-generation. In my view, however, code-generation is merely an implementation mechanism, one that isn t actually needed in most cases. Certainly there are plenty of times when you must use code-generation, but there are even more plenty of times when you don t need it. Using code-generation is one case where many people don t use aSemantic Model. In this case you parse the input text and directly produce the generated code. Although this is a common way of working with code-generated DSLs, it isn t one I reccommend for any but the very simplest cases. Using aSemantic Modelallows me to separate the parsing, the execution semantics, and the code generation into separate problems. This separation makes the whole exercise a lot simpler. It also allows me to change my mind. I can change my DSL from an internal to an external DSL (say) without altering my code-generation routines. Similarly I can easily generate multiple outputs without complicating my parse. I can also use both an interpreted model and code generation off the sameSemantic Model. As a result for almost all of this book, I m going to assume aSemantic Modelis present and the centre of the DSL effort. Using Language Workbenches The two styles of DSL I ve shown so far (internal and external) are the traditional ways of thinking about DSLs. They may not be as widely understood and used as they should be, but they have a long history and moderately wide usage. As a result the rest of this book concentrates on getting you started with these approaches using tools that are mature and easy to obtain. But there is a whole new category of tools on the horizon that could change the game of DSLs significantly tools I call Language Workbenches. ALanguage Workbenchis tool designed to help people create new DSLs, together with high quality tooling required to use those DSLs effectively. One of the big disadvantages of using an external DSL is that you re stuck with relatively limited tooling. Setting up syntax highlighting with a text editor is about as far as most people go. While you can argue that the simplicity of a DSL and the small size of the scripts means that may be enough, there s also an argument for the kind of sophisticated tooling that modern post-IntelliJ IDEs support. Language Workbenches make it easy not just to define a parser, but also to define a custom editing environment for that language. All of this is valuable, but the truly interesting aspect of language workbenches is that they allow a DSL designer to go beyond the the traditional text-based source editing, to different forms of language. The most obvious example of this is support for diagrammatic languages, which would allow me to specify the secret panel state machine directly with a state transition diagram. Figure 3 The secret panel state machine displayed in the MetaEdit language workbench.(source MetaCase) Not just does a tool like this allow you to have diagrammtic languages, it also allows you to look at a DSL script from multiple perspectives. In Figure3there is a diagram, but also lists of states and events, and a table to enter the event codes (which could be ommitted from the diagram if there s too much clutter there). This kind of multi-pane visual editing environment has been around for a while in lots of tools, but it s been a lot of effort to build something like this for yourself. One promise of language workbenches is that they make it quite easy to do this, certainly I was easily able to put together a similar example to Figure3quite quickly on my first play with the MetaEdit tool. The tools allows me to define theSemantic Modelfor state machines, define the graphical and tabular editors in Figure3and write a code generator from theSemantic Model. However, while such tools certainly look good, many developers are naturally suspicious of such doodleware tools. There are some very pragmatic reasons why a textual source representation makes sense. As a result other tools head in that direction, providing post-IntelliJ style capabilities such as syntax-directed editing, symbol completion and the like to textual languages. My own suspicion here is that if language workbenches really take off, the languages they ll produce aren t anything like what we consider to be a programming language. One of the common benefits of tools like this is that they allow non-programmers to program. I often sniff at that notion by pointing out that this was the original intent of COBOL. Yet I must also acknowledge a programming environment that has been extremely successful in providing programming tools to non-programmers who program without thinking of themselves of programming - spreadsheets. In programming language terms spreadsheets are based on a quite unusual computational model. Their appeal comes from a very deep integration of the notions of language and tool. Thus it s no surprise that Charles Simonyi combines both a history of development of these kinds of user tools with a long history of developing ideas in language workbenches. As a result I think that language workbenches have a remarkable potential. If they fulfill this they could entirely change the face of software development. This potential, however profound, is still somewhat in the future. It s still early days for language workbenches with new approaches appearing regularly and older tools still subject to deep evolution. As a result I don t have that much to say about them here, as I think they will change quite dramatically during the hoped-for lifetime of this book. But I do have a chapter on them at the end, as I think they are well worth keeping an eye on. Visualization One the great advantages of using a Language Workbench is that this enables you to a wider range of representations of the DSL, in particular graphical representations. However even with a textual DSL you can obtain a diagrammatic representation. Indeed we saw this very early on in this chapter. When looking at Figure1it might have struck you that the diagram was not as neatly drawn as I usually do. The reason for this is that I didn t draw the diagram, I generated it automatically from theSemantic Modelof Miss Grant s controller. Not just do my state machine classes execute, they also are able to render themselves use the dot language. The dot langauge is part of the GraphViz package, which is an open-source tool that allows you to describe mathematical graph structures (nodes and edges) and then automatically plot them. It figures out how to lay out the graph, you just tell it what the nodes and edges are, what shapes to use, and some other hints. Using a tool like GraphViz is extremely helpful for many kinds of DSLs because it gives another representation. Thisvisualizationrepresentation is similar to the DSL itself in that it allows a human to understand the model. The diference between a visualization and the source is that it isn t editable - however it can provide options that are too hard in an editable form, such as a diagram like this. In the terms of a language workbench you can think of a visualization as a read-only projection. It s something that can be less important for graphical language workbenches, since you use a diagram anyway, but it s still sometimes a handy technique. Visualizations don t have to be graphical. I often use a simple textual visualization to help me debug while I m writing a parser. I ve seen people generate visualizations in Excel to help communicate with domain experts. The point is that once you have done the hard work of creating a component framework like this, adding visualizations is really easy. You ll note here that the visualizations are produced from the framework, not the DSL, so you can do this even if you aren t using a DSL to populate the framework. Indeed the techniques in this book can be used for creating visualizations above and beyond DSL usage. A partial parser for a general purpose language can be used to visualize useful aspects of a general purpose program. Any interesting data strucutre can be visualized in interesting ways. Significant Revisions 06 Aug 07 First Draft 09 Apr 08 Split example from general issues